/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * FramePesquisarLivro.java
 *
 * Created on 08/05/2012, 20:16:50
 */

package br.edu.fatec.ads.view;

import br.edu.fatec.ads.classes.Livro;
import br.edu.fatec.ads.facade.FacadeAutor;
import br.edu.fatec.ads.facade.FacadeLivro;
import br.edu.fatec.ads.util.ComboBoxItem;
import br.edu.fatec.ads.util.FrameUtil;
import com.towel.el.FieldResolver;
import com.towel.el.factory.FieldResolverFactory;
import com.towel.swing.table.ObjectTableModel;
import java.awt.Dimension;
import java.util.List;
import javax.swing.ButtonModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import org.hibernate.HibernateException;

/**
 *
 * @author Ubirajara
 */
public class FramePesquisarLivro extends javax.swing.JInternalFrame {

    private List<ComboBoxItem> autoresCadastrados = null;
    private Livro livro = null;

    /** Creates new form FramePesquisarLivro */
    public FramePesquisarLivro() {
        initComponents();

        FrameUtil.getInstance().removerBarraTitulo(this);

        this.setVisible(true);

        autoresCadastrados = FacadeAutor.getInstance().recuperarTodosAutores();
        cmbAutores.setModel(new DefaultComboBoxModel(autoresCadastrados.toArray()));
        cmbAutores.setSelectedIndex(FrameUtil.FIRST_SELECT);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        grupoBotao = new javax.swing.ButtonGroup();
        lblCodigo = new javax.swing.JLabel();
        lblAutor = new javax.swing.JLabel();
        lblTitulo = new javax.swing.JLabel();
        btnConsultar = new javax.swing.JButton();
        rbtCodigo = new javax.swing.JRadioButton();
        rbtAutor = new javax.swing.JRadioButton();
        rbtTitulo = new javax.swing.JRadioButton();
        txtCodigo = new javax.swing.JTextField();
        txtTitulo = new javax.swing.JTextField();
        scrConsultaLivro = new javax.swing.JScrollPane();
        tblConsultaLivro = new javax.swing.JTable();
        cmbAutores = new javax.swing.JComboBox();
        btnVoltar = new javax.swing.JButton();
        txtEditar = new javax.swing.JButton();
        txtExcluir = new javax.swing.JButton();

        setMaximumSize(new java.awt.Dimension(800, 500));
        setMinimumSize(new java.awt.Dimension(800, 500));
        setPreferredSize(new java.awt.Dimension(800, 500));

        lblCodigo.setText("Código: ");

        lblAutor.setText("Autor:");

        lblTitulo.setText("Título:");

        btnConsultar.setText("Consultar");
        btnConsultar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnConsultarActionPerformed(evt);
            }
        });

        grupoBotao.add(rbtCodigo);
        rbtCodigo.setText("Código");
        rbtCodigo.setActionCommand("1");
        rbtCodigo.setName("busca_livros"); // NOI18N
        rbtCodigo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rbtCodigoMouseClicked(evt);
            }
        });

        grupoBotao.add(rbtAutor);
        rbtAutor.setText("Autor");
        rbtAutor.setActionCommand("2");
        rbtAutor.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rbtAutorMouseClicked(evt);
            }
        });

        grupoBotao.add(rbtTitulo);
        rbtTitulo.setText("Título");
        rbtTitulo.setActionCommand("3");
        rbtTitulo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rbtTituloMouseClicked(evt);
            }
        });

        txtCodigo.setEnabled(false);

        txtTitulo.setEnabled(false);

        scrConsultaLivro.setPreferredSize(new java.awt.Dimension(500, 0));

        FieldResolverFactory factory = new FieldResolverFactory(Livro.class);
        FieldResolver codigo = factory.createResolver("codigo", "Código");
        FieldResolver titulo = factory.createResolver("titulo", "Matrícula");
        FieldResolver isbn = factory.createResolver("isbn", "ISBN");
        FieldResolver emprestado = factory.createResolver("emprestado", "Emprestado?");

        ObjectTableModel<Livro> model = new ObjectTableModel<Livro>(new FieldResolver[]{ codigo, titulo, isbn, emprestado});
        tblConsultaLivro.setModel(model);
        tblConsultaLivro.setPreferredSize(new java.awt.Dimension(500, 0));
        tblConsultaLivro.setRowHeight(20);
        tblConsultaLivro.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        scrConsultaLivro.setViewportView(tblConsultaLivro);
        tblConsultaLivro.getColumnModel().getColumn(0).setResizable(false);
        tblConsultaLivro.getColumnModel().getColumn(1).setResizable(false);
        tblConsultaLivro.getColumnModel().getColumn(2).setResizable(false);
        tblConsultaLivro.getColumnModel().getColumn(3).setResizable(false);

        cmbAutores.setEnabled(false);

        btnVoltar.setText("Voltar");
        btnVoltar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVoltarActionPerformed(evt);
            }
        });

        txtEditar.setText("Editar");

        txtExcluir.setText("Excluir");
        txtExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtExcluirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(120, 120, 120)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(rbtCodigo)
                        .addGap(2, 2, 2)
                        .addComponent(rbtAutor)
                        .addComponent(rbtTitulo))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblCodigo)
                        .addGap(10, 10, 10)
                        .addComponent(txtCodigo, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblAutor)
                        .addGap(19, 19, 19)
                        .addComponent(cmbAutores, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblTitulo)
                        .addGap(20, 20, 20)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(scrConsultaLivro, 0, 500, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(txtTitulo, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 111, Short.MAX_VALUE)
                                .addComponent(btnConsultar, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(txtEditar, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(txtExcluir, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 251, Short.MAX_VALUE)
                                .addComponent(btnVoltar, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                .addContainerGap(114, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(60, 60, 60)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(rbtCodigo)
                    .addComponent(rbtAutor)
                    .addComponent(rbtTitulo))
                .addGap(25, 25, 25)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblCodigo)
                    .addComponent(txtCodigo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblAutor)
                    .addComponent(cmbAutores, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblTitulo)
                    .addComponent(txtTitulo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnConsultar, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(25, 25, 25)
                .addComponent(scrConsultaLivro, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(35, 35, 35)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnVoltar)
                    .addComponent(txtEditar)
                    .addComponent(txtExcluir))
                .addGap(60, 60, 60))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void rbtCodigoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rbtCodigoMouseClicked
        this.txtCodigo.setEnabled(true);

        this.cmbAutores.setEnabled(false);
        this.cmbAutores.setSelectedIndex(FrameUtil.FIRST_SELECT);

        this.limparCampos();
        this.limparTable();

        this.txtTitulo.setEnabled(false);
    }//GEN-LAST:event_rbtCodigoMouseClicked

    private void rbtAutorMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rbtAutorMouseClicked
        this.txtCodigo.setEnabled(false);
        this.cmbAutores.setEnabled(true);
        this.txtTitulo.setEnabled(false);

        this.limparCampos();
        this.limparTable();

    }//GEN-LAST:event_rbtAutorMouseClicked

    private void rbtTituloMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rbtTituloMouseClicked
        this.txtCodigo.setEnabled(false);

        this.cmbAutores.setEnabled(false);
        this.cmbAutores.setSelectedIndex(FrameUtil.FIRST_SELECT);

        this.limparCampos();
        this.limparTable();

        this.txtTitulo.setEnabled(true);
    }//GEN-LAST:event_rbtTituloMouseClicked

    private void btnConsultarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConsultarActionPerformed
        List<Livro> livrosConsultados = null;
        ButtonModel botaoSelecionado = grupoBotao.getSelection();

        this.limparTable();

        if(botaoSelecionado != null){
            String codigoConsulta = botaoSelecionado.getActionCommand();
            
            livro = new Livro();

            if(codigoConsulta.equals("1")){
                String codigoLivro = txtCodigo.getText();

                if(codigoLivro != null && FrameUtil.getInstance().isInteger(codigoLivro)){
                    livro.setCodigo(Integer.parseInt(codigoLivro));
                }else{
                    FrameUtil.getInstance().adicionarMensagemAtencao("Favor preencher o campo Código com números inteiros!");
                    return;
                }
            }else if(codigoConsulta.equals("2")){
                if(cmbAutores.getSelectedIndex() == FrameUtil.FIRST_SELECT){
                    FrameUtil.getInstance().adicionarMensagemAtencao("É necessário a seleção de um autor para a pesquisa!");
                    return;
                }
            }else{
                String titulo = txtTitulo.getText().trim();

                if(titulo != null && !titulo.isEmpty()){
                    livro.setTitulo(titulo);
                }else{
                    FrameUtil.getInstance().adicionarMensagemAtencao("É necessário o preenchimento do campo Título para a busca!");
                    return;
                }
            }

            if(codigoConsulta.equals("2")){
                livrosConsultados = FacadeLivro.getInstance().recuperarLivrosPorAutor(((ComboBoxItem)cmbAutores.getSelectedItem()).getCodigo());
            }else{
                livrosConsultados =  FacadeLivro.getInstance().recuperarLivrosPorCriterio(livro);
            }

            if(livrosConsultados != null && !livrosConsultados.isEmpty()){
                ObjectTableModel<Livro> tabelaLivros = (ObjectTableModel<Livro>) tblConsultaLivro.getModel();
                
                tabelaLivros.addAll(livrosConsultados);

                tabelaLivros.fireTableDataChanged();
                tblConsultaLivro.setPreferredSize(new Dimension(tblConsultaLivro.getSize().width, (20 * livrosConsultados.size())));
                tblConsultaLivro.revalidate();

                FrameUtil.getInstance().limparInputText(new JTextField[]{ this.txtCodigo, this.txtTitulo });
                FrameUtil.getInstance().limparComboBoxes(new JComboBox[]{ this.cmbAutores });
            }else{
                FrameUtil.getInstance().adicionarMensagemAtencao("A busca não retornou resultados");
            }
        }else{
            FrameUtil.getInstance().adicionarMensagemAtencao("É necessário a escolha e preenchimento de um dos três critérios de busca!");
        }
    }//GEN-LAST:event_btnConsultarActionPerformed

    private void btnVoltarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVoltarActionPerformed
        FrameUtil.getInstance().alterarTituloJanela(this, null);

        this.dispose();
    }//GEN-LAST:event_btnVoltarActionPerformed

    private void txtExcluirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtExcluirActionPerformed

        if(FrameUtil.getInstance().adicionarMensagemConfirmacao("Confirma a exclusão do registro?") == JOptionPane.YES_OPTION){

            if(tblConsultaLivro.getModel().getRowCount() == 0) { 
                FrameUtil.getInstance().adicionarMensagemErro("É necessário efetuar uma consulta para a exclusão!");
                
                return;
            }

            int linhaSelecionada = tblConsultaLivro.getSelectedRow();

            if(linhaSelecionada != -1){
                Livro livroPesquisar = ((ObjectTableModel<Livro>) tblConsultaLivro.getModel()).getValue(linhaSelecionada);

                try{
                    FacadeLivro.getInstance().excluirLivro(livroPesquisar);

                    FrameUtil.getInstance().adicionarMensagemSucesso("Livro excluído com sucesso!");

                    this.limparCampos();
                    this.limparTable();

                }catch(HibernateException cause){
                    FrameUtil.getInstance().adicionarMensagemErro(cause.getMessage());
                }
            }else{
                FrameUtil.getInstance().adicionarMensagemErro("É necessário a seleção de um registro para exclusão");
            }
        }
    }//GEN-LAST:event_txtExcluirActionPerformed

    private void limparCampos(){
        FrameUtil.getInstance().limparInputText(new JTextField[]{ this.txtCodigo, this.txtTitulo });
        FrameUtil.getInstance().limparComboBoxes(new JComboBox[]{ this.cmbAutores });
    }

    private void limparTable(){
        ((ObjectTableModel) this.tblConsultaLivro.getModel()).clear();

        ((ObjectTableModel) tblConsultaLivro.getModel()).fireTableDataChanged();

        tblConsultaLivro.setPreferredSize(new Dimension(tblConsultaLivro.getSize().width, 0));
        tblConsultaLivro.revalidate();

    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnConsultar;
    private javax.swing.JButton btnVoltar;
    private javax.swing.JComboBox cmbAutores;
    private javax.swing.ButtonGroup grupoBotao;
    private javax.swing.JLabel lblAutor;
    private javax.swing.JLabel lblCodigo;
    private javax.swing.JLabel lblTitulo;
    private javax.swing.JRadioButton rbtAutor;
    private javax.swing.JRadioButton rbtCodigo;
    private javax.swing.JRadioButton rbtTitulo;
    private javax.swing.JScrollPane scrConsultaLivro;
    private javax.swing.JTable tblConsultaLivro;
    private javax.swing.JTextField txtCodigo;
    private javax.swing.JButton txtEditar;
    private javax.swing.JButton txtExcluir;
    private javax.swing.JTextField txtTitulo;
    // End of variables declaration//GEN-END:variables

}
